package br.edu.unipampa.campeonato;

import br.edu.unipampa.clube.Clube;
import br.edu.unipampa.clube.Tecnico;
import java.util.ArrayList;
import java.util.Random;
import utilitario.EntradaDeDados;

public class PartidaDeFutebol {

    private Campeonato campeonato;
    private int scoreVisitante;
    private int scoreMandante;
    private Tecnico tecnico;

    public PartidaDeFutebol(Tecnico tecnico, Campeonato campeonato) {
        this.tecnico = tecnico;
        this.campeonato = campeonato;
    }

    public void jogarPartida(EntradaDeDados dados){
        jogarPrimeiroTempo();
        intervalo(tecnico, dados);
        jogarSeguntoTempo();
    }
    
    public void jogarPrimeiroTempo() {
        System.out.println("*********************** Inicia a Partida ***********************");
        System.out.println("<<<<<<<<<<<<<<<<<< " + tecnico.getClubeQueDirige().getNome() + " x "
                + tecnico.getClubeQueDirige().getClubeQueEnfrenta().getNome()
                + " >>>>>>>>>>>>>>>>>");
        System.out.println("+++++++++++++++++++++++ Jogo Válido pela " + (campeonato.getNumeroDaRodada()) + "ª Rodada!! +++++++++++++++++++++++");
        turnosClubeEscolhido();
    }

    public void jogarSeguntoTempo() {
        System.out.println("*********************** Começa o Segundo Tempo ***********************");
        turnosClubeEscolhido();
        if (scoreMandante > scoreVisitante) {
            System.out.println("<<<<<<<<<<<<<<<<<< Parabéns! Seu time venceu o jogo.. >>>>>>>>>>>>>>>>>");
            tecnico.getClubeQueDirige().setVitoria(tecnico.getClubeQueDirige().getVitoria() + 1);
            tecnico.getClubeQueDirige().setPontos(tecnico.getClubeQueDirige().getPontos() + 3);
            tecnico.getClubeQueDirige().getClubeQueEnfrenta().setDerrota(tecnico.getClubeQueDirige().getClubeQueEnfrenta().getDerrota() + 1);
        } else if (scoreVisitante > scoreMandante) {
            System.out.println("<<<<<<<<<<<<<<<<<< Seu time perdeu o jogo =/ >>>>>>>>>>>>>>>>>");
            tecnico.getClubeQueDirige().getClubeQueEnfrenta().setVitoria(tecnico.getClubeQueDirige().getClubeQueEnfrenta().getVitoria() + 1);
            tecnico.getClubeQueDirige().getClubeQueEnfrenta().setPontos(tecnico.getClubeQueDirige().getClubeQueEnfrenta().getPontos() + 3);
            tecnico.getClubeQueDirige().setDerrota(tecnico.getClubeQueDirige().getDerrota() + 1);
        } else {
            System.out.println("<<<<<<<<<<<<<<<<<< Jogo empatado >>>>>>>>>>>>>>>>>");
            tecnico.getClubeQueDirige().getClubeQueEnfrenta().setEmpate(tecnico.getClubeQueDirige().getClubeQueEnfrenta().getEmpate() + 1);
            tecnico.getClubeQueDirige().getClubeQueEnfrenta().setPontos(tecnico.getClubeQueDirige().getPontos() + 1);
            tecnico.getClubeQueDirige().setPontos(tecnico.getClubeQueDirige().getPontos() + 1);
            tecnico.getClubeQueDirige().setEmpate(tecnico.getClubeQueDirige().getEmpate() + 1);
        }
        System.out.println("\n*********************** Fim de Jogo ***********************");
        scoreMandante = 0;
        scoreVisitante = 0;
    }
    
    private int intervalo(Tecnico tecnico, EntradaDeDados dados) {
        System.out.println("****************** Intervalo de Jogo ******************");
        System.out.println("Tecle '1' para Substituiçoes - tecle '2' para consultar o informações do time adversário"
                + " - tecle '3' para jogar o Segunto Tempo");
        dados.setEscolha(dados.getTeclado().next());
        switch (dados.getEscolha()) {
            case "1":
                int numTitular,
                 numReserva = 0;
                tecnico.escalarTime();
                numTitular = Integer.parseInt(dados.escolherJogadorTitular());
                numReserva = Integer.parseInt(dados.escolherJogadorReserva());
                tecnico.substituirNaEscalacao(numTitular, numReserva);
                return intervalo(tecnico, dados);
            case "2":
                tecnico.consultarJogadoresDoClube(tecnico.getClubeQueDirige().getClubeQueEnfrenta());
                return intervalo(tecnico, dados);
            case "3":
                break;
            default:
                System.out.println("Digito Inválido!!! Tente novamente..");
                return intervalo(tecnico, dados);
        }
        return 0;
    }

    private void turnosClubeEscolhido() {
        turnoAtaque(tecnico.getClubeQueDirige(), tecnico.getClubeQueDirige().getClubeQueEnfrenta());
        System.out.println("");
        turnoDefesa(tecnico.getClubeQueDirige(), tecnico.getClubeQueDirige().getClubeQueEnfrenta());
        System.out.println("");
        turnoAtaque(tecnico.getClubeQueDirige(), tecnico.getClubeQueDirige().getClubeQueEnfrenta());
        System.out.println("");
        turnoDefesa(tecnico.getClubeQueDirige(), tecnico.getClubeQueDirige().getClubeQueEnfrenta());
    }
    
    public void simulaOutrosJogos(Clube mandante, Clube visitante) {
        for (int i = 0; i < 4; i++) {
            //Turno de ataque do Visitante
            int defesaMandante = defineAtaqueDefesa(calculaDefesa(mandante));
            int ataqueVisitante = defineAtaqueDefesa(calculaAtaque(visitante));
            if (ataqueVisitante > defesaMandante) {
                scoreVisitante++;
            }
            // Turno de ataque Mandante
            int ataqueMandante = defineAtaqueDefesa(calculaAtaque(mandante));
            int defesaVisitante = defineAtaqueDefesa(calculaDefesa(visitante));
            if (ataqueMandante > defesaVisitante) {
                scoreMandante++; // Gol Mandante
            }
        }
        if (scoreMandante > scoreVisitante) {
            System.out.println("Vitoria do "+mandante.getNome());
            mandante.setVitoria(mandante.getVitoria() + 1);
            mandante.setPontos(mandante.getPontos() + 3);
            visitante.setDerrota(visitante.getDerrota() + 1);
        }
        if (scoreVisitante > scoreMandante) {
            System.out.println("Vitoria do "+visitante.getNome());
            visitante.setVitoria(visitante.getVitoria() + 1);
            visitante.setPontos(visitante.getPontos() + 3);
            mandante.setDerrota(mandante.getDerrota() + 1);
        }
        if(scoreMandante == scoreVisitante){
             System.out.println("Empate");     
            visitante.setEmpate(visitante.getEmpate() + 1);
            visitante.setPontos(visitante.getPontos() + 1);
            mandante.setPontos(mandante.getPontos() + 1);
            mandante.setEmpate(mandante.getEmpate() + 1);
            System.out.println("*** Num empates do "+visitante.getNome()+" "+visitante.getEmpate());
            System.out.println("*** Num empates do "+mandante.getNome()+" "+mandante.getEmpate());
        }
        System.out.println("<<<<<<<< "+mandante.getNome()+" "+scoreMandante+" x "+scoreVisitante+ " "+visitante.getNome()+" >>>>>>>>>>>");
        scoreMandante = 0;
        scoreVisitante = 0;
    }
    
    private void turnoAtaque(Clube mandante, Clube visitante) {
        int ataqueMandante = defineAtaqueDefesa(calculaAtaque(mandante));
        int defesaVisitante = defineAtaqueDefesa(calculaDefesa(visitante));
        System.out.println("-------- Seu Time está no ataque... --------");
        System.out.println("Ataque: " + ataqueMandante + " Defesa " + defesaVisitante);
        if (ataqueMandante > defesaVisitante) {
            System.out.println("Feitooo!!! Gooooool.");
            scoreMandante++; // Gol Mandante
        } else {
            System.out.println("Ataque Interceptado...");
        }
        System.out.println("============================= PLACAR " + scoreMandante + " x " + scoreVisitante + " =============================");
    }

    private void turnoDefesa(Clube mandante, Clube visitante) {
        int defesaMandante = defineAtaqueDefesa(calculaDefesa(mandante));
        int ataqueVisitante = defineAtaqueDefesa(calculaAtaque(visitante));
        System.out.println("------------- Time visitante no ataque... ---------------- ");
        System.out.println("Ataque: " + ataqueVisitante + " Defesa " + defesaMandante);
        if (ataqueVisitante > defesaMandante) {
            System.out.println("Goooool do time adversário");
            scoreVisitante++;// Gol Visitante
        } else {
            System.out.println("Seu time bloqueou o ataque do adversário...");
        }
        System.out.println("============================= PLACAR " + scoreMandante + " x " + scoreVisitante + " =============================");
    }

    private int calculaAtaque(Clube x) {
        double ataqueTotal = 0;
        for (int i = 0; i < x.getListaDeJogadoresTitularesDaPartida().size(); i++) {
            ataqueTotal = ataqueTotal + x.getListaDeJogadoresTitularesDaPartida().get(i).getAtaque();
        }
        ataqueTotal = ataqueTotal / 11;
        int result = (int) Math.round(ataqueTotal);
        return result;
    }

    private int calculaDefesa(Clube y) {
        double defesaTotal = 0;
        for (int i = 0; i < y.getListaDeJogadoresTitularesDaPartida().size(); i++) {
            defesaTotal = defesaTotal + y.getListaDeJogadoresTitularesDaPartida().get(i).getDefesa();
        }
        defesaTotal = defesaTotal / 11;
        int result = (int) Math.round(defesaTotal);
        return result;
    }

    private int defineAtaqueDefesa(int ataqueDefesaCalculado) {
        Random baralho = new Random();
        int saida = baralho.nextInt(ataqueDefesaCalculado);
        return saida;
    }

    public Campeonato getCampeonato() {
        return campeonato;
    }

    public void setCampeonato(Campeonato campeonato) {
        this.campeonato = campeonato;
    }

}
